<?php

namespace Agp\CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Doctrine\Common\Collections\ArrayCollection;
use APY\DataGridBundle\Grid\Mapping as GRID;

/**
 * Agp\CoreBundle\Entity\RelatorioPeriodico
 *
 * @ORM\Table(name="relatorio_periodico")
 * @ORM\Entity(repositoryClass="Agp\CoreBundle\Repository\RelatorioPeriodicoRepository")
 * @ORM\HasLifecycleCallbacks
 * 
 * @GRID\Source(columns="codRelatorioPeriodico, descricao, tipo, intervalo")
 */
class RelatorioPeriodico
{
    /**
     * @var integer $codRelatorioPeriodico
     *
     * @ORM\Column(name="cod_relatorio_periodico", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * 
     * @GRID\Column(title="Código", visible=false, type="text", size="5", primary=true)
     */
    protected $codRelatorioPeriodico;

    /**
     * @var object $empresa
     *
     * @ORM\ManyToOne(targetEntity="Agp\CoreBundle\Entity\Empresa", fetch="EAGER")
     * @ORM\JoinColumn(name="cod_empresa", referencedColumnName="cod_empresa", onDelete="Cascade", nullable=false)
     */
    protected $empresa;

    /**
     * @ORM\ManyToMany(targetEntity="Agp\CoreBundle\Entity\Atendente")
     * @ORM\JoinTable(name="relatorio_periodico_atendente",
     *     joinColumns={@ORM\JoinColumn(name="cod_relatorio_periodico", referencedColumnName="cod_relatorio_periodico", onDelete="Cascade")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="cod_atendente", referencedColumnName="cod_atendente", onDelete="Cascade")}
     * )
     * @var ArrayCollection $atendentes
     */ 
    protected $atendentes;
    
    /**
     * @ORM\ManyToMany(targetEntity="Agp\CoreBundle\Entity\Evento")
     * @ORM\JoinTable(name="relatorio_periodico_evento",
     *     joinColumns={@ORM\JoinColumn(name="cod_relatorio_periodico", referencedColumnName="cod_relatorio_periodico", onDelete="Cascade")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="cod_evento", referencedColumnName="cod_evento", onDelete="Cascade")}
     * )
     * @var ArrayCollection $eventos
     */ 
    protected $eventos;
    
    /**
     * @ORM\ManyToMany(targetEntity="Agp\CoreBundle\Entity\TerminalEmpresa")
     * @ORM\JoinTable(name="relatorio_periodico_terminal_empresa",
     *     joinColumns={@ORM\JoinColumn(name="cod_relatorio_periodico", referencedColumnName="cod_relatorio_periodico", onDelete="Cascade")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="cod_terminal_empresa", referencedColumnName="cod_terminal_empresa", onDelete="Cascade")}
     * )
     * @var ArrayCollection $terminais
     */ 
    protected $terminais;
    
    const IN_DIARIO = 'Diário';
    const IN_SEMANAL = 'Semanal';
    const IN_MENSAL = 'Mensal';
    /**
     * @ORM\Column(name="intervalo", type="string", nullable=false)
     * @var string
     * 
     * @GRID\Column(title="Intervalo", type="text")
     */
    protected $intervalo;
    
    /**
     * @ORM\Column(name="descricao", length=45, type="string", nullable=false)
     * @Assert\NotBlank()
     * @var string
     * 
     * @GRID\Column(title="Descrição", type="text")
     */
    protected $descricao;
    
    /**
     * @ORM\Column(name="email", type="text", nullable=true)
     * @Assert\NotBlank(groups={"email"})
     * @var string
     */
    protected $email;
    
    const TP_VENDAS = 'Vendas';
    const TP_VENDAS_TERMINAL = 'Vendas agrupado por terminal';
    const TP_VENDAS_TERMINAL_PRODUTO = 'Vendas agrupado por terminal e produto';
    const TP_PRODUTOS_VENDIDOS = 'Produtos vendidos';
    const TP_PRODUTOS_VENDIDOS_PRODUTO = 'Produtos vendidos agrupado por produto';
    const TP_MOVIMENTACAO = 'Movimentação';
    const TP_MOVIMENTACAO_TERMINAL = 'Movimentação agrupado por terminal';
    const TP_PDV = 'Pontos de venda';
    /**
     * @ORM\Column(name="tipo_relatorio", type="string", nullable=false)
     * @var string
     * 
     * @GRID\Column(title="Tipo", type="text")
     */
    protected $tipo;
    
    /**
     * @ORM\Column(name="notificacao",type="boolean", nullable=true)
     * @var string
     * 
     */
    protected $notificacao;
    
    /**
     * @ORM\Column(name="dt_gerado",type="datetime", nullable=false)
     * @var date
     * 
     */
    protected $dtGerado;
    
    /**
     * @ORM\Column(name="dia_mes", type="string", nullable=true)
     * @var string
     */
    protected $diaMes;
    
    /**
     * @ORM\Column(name="dia_semana", type="string", nullable=true)
     * @var string
     */
    protected $diaSemana;
    
    /**
     * @ORM\Column(name="hora_diario", type="datetime", nullable=true)
     * @var tie
     */
    protected $hora;
        
    
    public function __construct() {
        $this->dtGerado = new \DateTime();
        $this->notificacao = false;
        $this->atendentes = new ArrayCollection;
        $this->eventos = new ArrayCollection;
        $this->terminais = new ArrayCollection;
    }
    
    /**
     * @ORM\PrePersist
     * @ORM\PreUpdate
     */
//    public function dtGerado(){
//        $atual = new \DateTime;
//        switch ($this->intervalo){
//            case self::IN_DIARIO:
//                 $this->dtGerado = $this->hora;
//            case self::IN_SEMANAL:
//                
//                 break;
//            case self::IN_MENSAL:
//                 if ($atual->format('d') == $this->diaCalculo){
//                     $this->setDtGeradoMensal($atual);
//                     return true;
//                 }else{
//                     return false;
//                 }
//                 break;
//        }
// 
//    }

    public function isValid(){

        $atual = new \DateTime;
        switch ($this->intervalo){
            case self::IN_DIARIO:
                 return true;
                 break;
            case self::IN_SEMANAL:
                 if ($atual->format('w') == $this->diaSemana){
                     return true;
                 }else{
                     return false;
                 }
                 break; 
            case self::IN_MENSAL:
                 if ($atual->format('d') == $this->diaMes){
                     return true;
                 }else{
                     return false;
                 }
                 break;
        }

    }

    public function getDtInicio()
    {
        $date = clone $this->getDtTermino();
        switch ($this->intervalo){
            case self::IN_DIARIO:
                 return $date->sub(new \DateInterval('P1D'));
                 break;
            case self::IN_SEMANAL:
                 $date->sub(new \DateInterval('P1W'));
                 $date->setTime(00, 00, 00);
                 return $date;
                 break; 
            case self::IN_MENSAL:
                 $date->sub(new \DateInterval('P1M'));
                 $date->setTime(00, 00, 00);
                 return $date;
                 break;
        }

    }

    public function getDtTermino()
    {
        $hoje = new \DateTime();
        $hoje->sub(new \DateInterval('P1D'));
        switch ($this->intervalo){
            case self::IN_DIARIO:
                 return $hoje->setTime($this->hora->format('H'), $this->hora->format('i'), $this->hora->format('s'));
                 break;
            case self::IN_SEMANAL:
                 $atual = new \DateTime();
                 $mes = $hoje->format('m');
                 $ano = $hoje->format('Y');
                 $dia = $atual->format('d');
                 return new \DateTime($ano.'-'.$mes.'-'. $dia.' 00:00:00');
                 break;
            case self::IN_MENSAL:
                 $atual = new \DateTime();
                 $mes = $atual->format('m');
                 $ano = $atual->format('Y');;
                 return new \DateTime($ano.'-'.$mes.'-'. $this->diaMes.' 00:00:00');
                 break;
        }
 
    }
    
    public function getArrayEmails(){
        $emails = explode(';', $this->email);
        $return = array();
        
        foreach ($emails as $email){
            if ($email != ""){
                $return[] = trim($email);
            }
        }
        
        return $return;
        
    }

    public function getCodRelatorioPeriodico() {
        return $this->codRelatorioPeriodico;
    }

    public function setCodRelatorioPeriodico($codRelatorioPeriodico) {
        $this->codRelatorioPeriodico = $codRelatorioPeriodico;
    }

    public function getEmpresa() {
        return $this->empresa;
    }

    public function setEmpresa($empresa) {
        $this->empresa = $empresa;
    }

    /**
     * Add $terminal
     *
     * @param Agp\CoreBundle\Entity\TerminalEmpresa
     */
    public function addterminal(\Agp\CoreBundle\Entity\TerminalEmpresa $terminal)
    {
        $this->terminais[] = $terminal;
    }
    
    /**
     * Set terminais
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function setTerminais($terminais)
    {
        return $this->terminais = $terminais;
    }

    /**
     * Get terminais
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getTerminais()
    {
        return $this->terminais;
    }
    
    public function getTipo() {
        return $this->tipo;
    }

    public function setTipo($tipo) {
        $this->tipo = $tipo;
    }

    public function getIntervalo() {
        return $this->intervalo;
    }

    public function setIntervalo($intervalo) {
        $this->intervalo = $intervalo;
    }
    
    public function getDescricao() {
        return $this->descricao;
    }

    public function setDescricao($descricao) {
        $this->descricao  = mb_strtoupper($descricao, 'UTF-8');
    }
    
    public function getNotificacao() {
        return $this->notificacao;
    }

    public function setNotificacao($notificacao) {
        $this->notificacao = $notificacao;
    }
    
    public function getDtGerado() {
        return $this->dtGerado;
    }

    public function setDtGerado($dtGerado) {
        $this->dtGerado = $dtGerado;
    }

    public function getDiaMes() {
        return $this->diaMes;
    }

    public function setDiaMes($diaMes) {
        $this->diaMes = $diaMes;
    }

    public function getDiaSemana() {
        return $this->diaSemana;
    }

    public function setDiaSemana($diaSemana) {
        $this->diaSemana = $diaSemana;
    }

    public function getHora() {
        return $this->hora;
    }

    public function setHora($hora) {
        $this->hora = $hora;
    }

    public static function getTipoList(){
        return array (self::TP_VENDAS => ucFirst(self::TP_VENDAS),
                     self::TP_VENDAS_TERMINAL => ucFirst(self::TP_VENDAS_TERMINAL),
                     self::TP_VENDAS_TERMINAL_PRODUTO => ucFirst(self::TP_VENDAS_TERMINAL_PRODUTO),
                     self::TP_PRODUTOS_VENDIDOS => ucFirst(self::TP_PRODUTOS_VENDIDOS),
                     self::TP_PRODUTOS_VENDIDOS_PRODUTO => ucFirst(self::TP_PRODUTOS_VENDIDOS_PRODUTO),
                     self::TP_MOVIMENTACAO => ucfirst(self::TP_MOVIMENTACAO),
                     self::TP_MOVIMENTACAO_TERMINAL => ucfirst(self::TP_MOVIMENTACAO_TERMINAL),
                     self::TP_PDV => ucfirst(self::TP_PDV));
    }
    
    public static function getIntervaloList(){
        return array (self::IN_DIARIO => ucFirst(self::IN_DIARIO),
                     self::IN_SEMANAL => ucfirst(self::IN_SEMANAL),
                     self::IN_MENSAL => ucFirst(self::IN_MENSAL));
    }
    
    public function getEmail() {
        return $this->email;
    }

    public function setEmail($email) {
        $this->email = $email;
    }
    
    public function getAtendentes() {
        return $this->atendentes;
    }

    public function setAtendentes($atendentes) {
        $this->atendentes = $atendentes;
    }

    public function getEventos() {
        return $this->eventos;
    }

    public function setEventos($eventos) {
        $this->eventos = $eventos;
    }
}
